package com.lgl.scsapi.util.utils;

import com.lgl.scsapi.system.model.PageData;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.springframework.util.StringUtils;

import java.util.Calendar;
import java.util.Random;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 通用工具类
 */

public class Tools {
	private static String randStr = "ABCDEFGHJKLMNPRSTUVWXYZ0123456789";
	/**
	 * 随机生成六位数验证码 
	 * @return 随机6位整数
	 */
	public static int getRandomNum(){
		 Random r = new Random();
		 return r.nextInt(900000) + 100000;
	}
	/**
	 * 生成0到size-1之间的随机数
	 * @return 0到1之间的随机数
	 */
	public static int getZeroToSizeRandomNum(int size){
		 return (int)(Math.random() * size);
	}
	/**
	 * 生产随机字符串
	 * @return 32位随机字符串
	 */
	public static String getUUID(){
		 return UUID.randomUUID().toString().replace("-", "");
	}
	
	/**
	 * 字符串转换为字符串数组
	 * @param str 字符串
	 * @param splitRegex 分隔符
	 * @return
	 */
	public static String[] str2StrArray(String str,String splitRegex){
		if(!StringUtils.hasText(str)){
			return null;
		}
		return str.split(splitRegex);
	}
	/**
	 * 用默认的分隔符(,)将字符串转换为字符串数组
	 * @param str	字符串
	 * @return
	 */
	public static String[] str2StrArray(String str){
		return str2StrArray(str,",\\s*");
	}

	/**
	  * 验证邮箱
	  * @param email 要验证的邮箱
	  * @return 邮箱验证结果，邮箱正确：true,不正确：false
	  */
	public static boolean checkEmail(String email){
		try{
			String check = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
		    Pattern regex = Pattern.compile(check);
		    Matcher matcher = regex.matcher(email);
			return matcher.matches();
	    }catch(Exception e){
	    }
		return false;
	}

	/**
	 * 字符串是否为整数
	 * @param strNum 字符串数字
	 * @return true: 是数字，false: 不是数字
	 */
	public static boolean strIsInt(String strNum){
		if (strNum == null){
			return false;
		}
		Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
		return pattern.matcher(strNum).matches();
	}
	/**
	* 验证手机号码
	* @param mobile 手机号码
	* @return  true:手机号码格式正确，false:格式不正确
	*/
	public static boolean checkMobileNumber(String mobile){
		try {
			if (!StringUtils.hasText(mobile)) {
				return false;
			}
			String mobileReg = "^(1[1-9])\\d{9}$";
			return Pattern.matches(mobileReg, mobile);
		} catch (Exception e) {
		}
		return false;
	}

	/**
	 * md5加密字符串
	 * @param str  要加密的字符串
	 * @return
	 */
	/*public static String md5(String str) {
		try {
			MessageDigest md = MessageDigest.getInstance("MD5");
			md.update(str.getBytes());
			byte b[] = md.digest();
			int i;
			StringBuffer buf = new StringBuffer("");
			for (int offset = 0; offset < b.length; offset++) {
				i = b[offset];
				if (i < 0)
					i += 256;
				if (i < 16)
					buf.append("0");
				buf.append(Integer.toHexString(i));
			}
			str = buf.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return str;
	}*/
	/**
	 * 获取一个随机字符
	 * @return A-Z,0-9的随机字符串
	 */
	public static char randomChar(){
		Random r = new Random();
		return randStr.charAt(r.nextInt(randStr.length()));
	}
	/**
	 * 加密密码
	 * @param password 要加密的密码或其它字符串
	 * @return 加密后的密码
	 */
	public static String encryptPassword(String password){
		return new SimpleHash(Constants.ALGORITHM_NAME,password,Constants.SHIRO_SALT,Constants.HASH_ITERATIONS).toHex();
	}

	/**
	 * 是否热门城市
	 * @param cityCode 要判断的城市编码
	 * @return true:是热门城市,false:不是热门城市
	 */
	public static boolean isHotCity(String cityCode){
		if (!StringUtils.hasText(cityCode)){
			return false;
		}
		for (String hotCityCode : Constants.HOT_CITY_IDS){
			if (cityCode.equals(hotCityCode)){
				return true;
			}
		}
		return false;
	}

	/**
	 * 获取年份，如果pageData为空或参数错误，则返回当前年份
	 * @param pageData 年份参数
	 * @return 参数中的年份/当前年份
	 */
	public static int getYear(PageData pageData){
		int thisYear;
		try {
			thisYear = Integer.parseInt(pageData.getString("thisYear"));
		}catch (Exception e){
			thisYear = Calendar.getInstance().get(Calendar.YEAR);
		}
		return thisYear;
	}

	/**
	 * 初始化日期参数
	 * @param pd PageData参数对象
	 * @param endYear 结束年份
	 * @param startYear 开始年份
	 */
	public static void initDate(PageData pd,int endYear,int startYear){
		pd.put("serviceEndDate",endYear + "-12-31 23:59:59");
		pd.put("serviceStartDate",startYear + "-01-01 00:00:00");
	}
	/**
	 * 初始化今年/去年相关的参数
	 * @param thisLastPd 参数
	 */
	public static void initThisLastParam(PageData thisLastPd){
		if (thisLastPd == null){
			thisLastPd = new PageData(8);
		}
		int thisYear = getYear(thisLastPd);
		int lastYear = thisYear - 1;
		thisLastPd.put("thisYear",thisYear);
		thisLastPd.put("lastYear",lastYear);
		thisLastPd.put("serviceEndDate",thisYear + "-12-31 23:59:59");
		thisLastPd.put("serviceStartDate",lastYear + "-01-01 00:00:00");
	}

	/**
	 * 初始化页码和每页显示记录数
	 * @param pageNo 页码
	 * @param pageSize 每页显示记录数
	 */
	public static void initPageNoAndSize(int pageNo,int pageSize){
		if (pageNo < 1){
			pageNo = 1;
		}
		if (pageSize < 1){
			pageSize = Constants.PAGE_SIZE;
		}
	}
}